package com.qabaco.odondata.view.servicio;

import com.qabaco.odondata.model.entities.Caso;

import com.qabaco.odondata.model.entities.Tema;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory;

public class GaleriaCasos extends ServicioGlobal {
    public GaleriaCasos() {
        super();
    }
    
    public static GaleriaCasos getCustomInstance(){          
        WebContext ctx = WebContextFactory.get();
        HttpServletRequest req = ctx.getHttpServletRequest();
        
        GaleriaCasos instancia = null; 
        if (req.getSession().getAttribute("GALERIA_KEY") == null){
            instancia = new GaleriaCasos();
            req.getSession().setAttribute("GALERIA_KEY", instancia);
        }else{
            instancia = (GaleriaCasos)req.getSession().getAttribute("GALERIA_KEY");              
        }
        
        return instancia;
    }
    
    public HashMap initGaleriaCasos(){
        HashMap respuesta = new HashMap();                         
        if (usuarioConectado() == null || usuarioConectado().getId() == null) return null;               
        
        respuesta.put("LISTA_CASOS", obtenerListaCasosTree());            
        
        return respuesta;
    }
    
    private List<Caso> obtenerListaCasosTree(){
        List<Caso> listaCasos =  getServicio().qCasosAll(new HashMap());
        listaCasos = ordenarListaCasos(listaCasos);
        return listaCasos;
    }
    
    
    private List<Caso> ordenarListaCasos(List<Caso> listaCasos){        
        List<Caso> listaPadres = new ArrayList<Caso>();
        List<Caso> listaHijos = new ArrayList<Caso>();        
        if (listaCasos != null && listaCasos.size() > 0){                
            for (Caso caso : listaCasos){                
                if (caso.getIdPadre().intValue() == 0){
                    listaPadres.add(caso);                    
                }else{
                    listaHijos.add(caso);                    
                }
            }                        
        }        
        
        if (listaPadres != null && listaPadres.size() > 0){ 
            for (Caso casoPadre : listaPadres){                
                asignarHijos(casoPadre, listaHijos);
            }               
        }                
        return listaPadres;    
    }
    
    
    // Funci�n recursiva para armar la estructura en forma de arbol
    private List asignarHijos (Caso casoPadre, List<Caso> listaHijos ){                        
        for (Caso casoHijo : listaHijos){            
            if(casoPadre.getId().intValue() == casoHijo.getIdPadre().intValue()){
                casoPadre.getListaCasos().add(casoHijo);
                asignarHijos(casoHijo, listaHijos);
            }
        }                
        return null;
    }
    
    public HashMap guardarNuevoCaso(HashMap parametros){
        HashMap respuesta = new HashMap();
        
        Caso caso = new Caso();
        
        caso.setNombre((String)parametros.get("titulo"));
        caso.setDescripcion((String)parametros.get("descripcion"));
        //tema.setListaImagenes(listaImagenes);
        //tema.setListaVideos(listaVideos);
        String imagenes = (String)parametros.get("idImagenes");
        String idCasoPadre = (String)parametros.get("idCasoPadre");
        if (idCasoPadre != null)
            caso.setIdPadre(Integer.valueOf(idCasoPadre));
        else
            caso.setIdPadre(0); // Raiz
        
        getServicio().persistCaso(caso, imagenes);
        
        respuesta.put("CASO_NEW", caso);
        
        return respuesta;
    }
    
    public HashMap guardarModificarCaso(HashMap parametros){
      HashMap respuesta = new HashMap();
      
      String idCaso = (String)parametros.get("idCaso");
      
      
      Caso caso = (Caso)getServicio().find(Caso.class, Integer.valueOf(idCaso));                        
      
      
      caso.setNombre((String)parametros.get("titulo"));
      caso.setDescripcion((String)parametros.get("descripcion"));
      //tema.setListaImagenes(listaImagenes);
      //tema.setListaVideos(listaVideos);
      String imagenesModificadas = (String)parametros.get("imagenesModificadas"); // Las i
      String imagenes = (String)parametros.get("idImagenes"); // Nuevas imagenes
      
      String imagenesOrdenadas = (String)parametros.get("imagenesOrdenadas");
      
      //String idTemaPadre = (String)parametros.get("idTemaPadre");
      //if (idTemaPadre != null)
        //  tema.setIdPadre(Integer.valueOf(idTemaPadre));
      //else
        //  tema.setIdPadre(0); // Raiz
      
      getServicio().mergeCaso(caso, imagenes, imagenesModificadas, imagenesOrdenadas); 
    
      respuesta.put("CASO_EDIT", caso);
      
      return respuesta;
    }
    
    
    public HashMap eliminarCaso(Long idCaso){
        HashMap respuesta = new HashMap();
        System.out.println("ID CASO " + idCaso);
        
        getServicio().removeCasosRecursivamente(idCaso);
       
        
        return respuesta;
    }
    
    
    
    private void buscarCaso(List<Caso> listaCasos, Integer idCaso){
        if (casoBusqueda != null) return;
        
        if (listaCasos != null){
            for (Caso casoAux : listaCasos){
                if (casoAux.getId().intValue() == idCaso.intValue()){
                    casoBusqueda = casoAux;
                    return;
                }else{
                    if (casoAux.getListaCasos() != null)
                        buscarCaso(casoAux.getListaCasos(), idCaso);                    
                }
            }      
        }
    }
    
    private Caso casoBusqueda = null;
    public HashMap moverCaso(HashMap parametros){
        HashMap respuesta = new HashMap();
        
        
        Integer idCasoMover   = Integer.valueOf((String)parametros.get("idCasoMover"));
        Integer idCasoDestino = Integer.valueOf((String)parametros.get("idCasoDestino"));
        Boolean moverHijos    = Boolean.valueOf((String)parametros.get("moverHijos"));
        
        // Validaci�n para validar si no es un subtema.
        List<Caso> listaCasos = obtenerListaCasosTree();
        
        // Buscar el tema destino
        buscarCaso(listaCasos, idCasoMover);
        
        Caso casoMover = casoBusqueda;
        casoBusqueda = null; // Limpia el puntero
            
        buscarCaso(casoMover.getListaCasos(), idCasoDestino);
        Caso casoMoverYaExiste = casoBusqueda;
            
        if (casoMoverYaExiste != null)
            respuesta.put("ERROR", "El caso que esta intentando mover es un subcaso del caso destino");
        else{
            getServicio().moverCaso( idCasoMover, idCasoDestino, moverHijos);             
            respuesta.put("LISTA_CASOS", obtenerListaCasosTree());    
        }
          
      
        return respuesta;        
    }
    
    
}
